{
  mkCargoDerivation,
  cargo-tarpaulin,
  lib,
}:
let
  xml = if lib.versionOlder cargo-tarpaulin.version "0.27.0" then "Xml" else "xml";
in
{
  cargoExtraArgs ? "",
  cargoTarpaulinExtraArgs ? "--skip-clean --out ${xml} --output-dir $out",
  ...
}@origArgs:
let
  args = builtins.removeAttrs origArgs [
    "cargoExtraArgs"
    "cargoTarpaulinExtraArgs"
  ];
in
mkCargoDerivation (
  args
  // {
    buildPhaseCargoCommand = "cargoWithProfile tarpaulin ${cargoExtraArgs} ${cargoTarpaulinExtraArgs}";

    pnameSuffix = "-tarpaulin";

    # With `--skip-clean` cargo-tarpaulin tries to mutate dependency files in place
    doNotLinkInheritedArtifacts = args.doNotLinkInheritedArtifacts or true;

    nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [ cargo-tarpaulin ];
  }
)
